闲扯
找了好久的 $FHQ-Treap$ 的启发式合并,终于找到了,但是题解里面为毛全是 $splay$ 和线段树合并啊。。。
少有的几篇 $FHQ$ 的题解,结果基本都是指针的,只有一片能看。。。
题面
Solution
平衡树
因为要查询第 $K$ 大,很容易想到平衡树。
但是连边的操作相当于是合并两个平衡树,所以我们需要一个高效的合并方式——启发式合并。
我们每次暴力的将较小的平衡树中的节点加入到较大的平衡树种,可以证明时间复杂度是 $O(n\log^2 n)$ 的。
每次连边时,先找到每个点所属的平衡树的编号,如果两个点已经在同一个平衡树里面,就忽略掉;否则,判断大小之后,合并即可。
动态开点权值线段树+线段树合并
对每个点建一颗动态开点的权值线段树,用并查集维护点与点之间的连通性。
合并时如果不在一个连通块里面,就合并两个线段树。
注意合并时,如果在并查集中将 $x$ 的父节点指向 $y$ ,那么,合并时也要 $x$ 所在的线段树合并进 $y$ 。
Code
平衡树
1 |
|
线段树
1 |
|
总结
模板题,要记住,不能忘了。